interface StoredItem<T> {
    value: T;
    expiration: number;
}

/**
 * window.localStorage
 * @method set 设置
 * @method get 获取
 * @method remove 移除
 * @method clear 移除全部
 */
export const Local = {
    set(key: string, val: any) {
        window.localStorage.setItem(key, JSON.stringify(val))
    },
    get(key: string) {
        const json: any = window.localStorage.getItem(key)
        return JSON.parse(json)
    },
    remove(key: string) {
        window.localStorage.removeItem(key)
    },
    clear() {
        window.localStorage.clear()
    },
}

/**
 * window.sessionStorage
 * @method set 设置会话缓存
 * @method get 获取会话缓存
 * @method remove 移除会话缓存
 * @method clear 移除全部会话缓存
 */
export const Session = {
    set(key: string, val: any) {
        window.sessionStorage.setItem(key, JSON.stringify(val))
    },
    get(key: string) {
        const json: any = window.sessionStorage.getItem(key)
        return JSON.parse(json)
    },
    remove(key: string) {
        window.sessionStorage.removeItem(key)
    },
    clear() {
        window.sessionStorage.clear()
    },
}

/**
 * 将带有过期时间的数据设置到 localStorage 中
 * @param key 键名
 * @param value 值
 * @param expirationMinutes 过期时间（以分钟为单位）
 */
export function setLocalStorageWithExpiration<T>(key: string, value: T, expirationMinutes: number): void {
    const expirationMS = expirationMinutes * 60 * 1000; // 将过期时间转换为毫秒
    const expirationDate = new Date().getTime() + expirationMS; // 计算过期日期
    console.log('001', new Date().getTime());
    
    const item: StoredItem<T> = {
        value: value,
        expiration: expirationDate
    };
  
    const itemString = JSON.stringify(item); // 将存储的数据项转换为字符串
    localStorage.setItem(key, itemString); // 存储字符串到 localStorage 中
}
  
/**
   * 从 localStorage 中获取带有过期时间的数据，并检查过期时间
   * @param key 键名
   * @returns 如果数据存在且未过期，则返回数据的值；否则返回 null
   */
export function getLocalStorageWithExpiration<T>(key: string): T | null {
    const itemString = localStorage.getItem(key);
  
    if (itemString) {
        const item: StoredItem<T> = JSON.parse(itemString); // 解析存储的字符串
        
        console.log('002', new Date().getTime(), item.expiration);
        if (new Date().getTime() > item.expiration) {
        // 数据已过期，从 localStorage 中删除
            localStorage.removeItem(key);
            return null;
        }
  
        return item.value;
    }
  
    return null;
}
